package org.example;

import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.example.entity.loginuser;
import org.example.entity.user;
import org.example.mapper.UserMapper;
import org.example.mapper.login;


import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;

//TIP To <b>Run</b> code, press <shortcut actionId="Run"/> or
// click the <icon src="AllIcons.Actions.Execute"/> icon in the gutter.
public class Main {
    public static void main(String[] args) {

        InputStream inputStream;
//        作用：声明一个 InputStream 类型的变量 inputStream，用于后续加载 MyBatis 配置文件的输入流。
//        说明：InputStream 是 Java 中用于表示输入流的基础类，这里用于读取 MyBatis 配置文件 mybatis-config.xml 的内容。
//        作用：尝试从类路径中加载 MyBatis 配置文件 mybatis-config.xml，并将其内容封装到 inputStream 中。
//        说明：
//        Resources.getResourceAsStream(String resource) 是 MyBatis 提供的一个工具方法，用于从类路径中加载资源文件并返回一个 InputStream。
//        如果文件加载成功，inputStream 将包含 mybatis-config.xml 文件的内容。
//        如果加载过程中发生 IOException（例如文件不存在或无法读取），则捕获该异常并将其封装为一个 RuntimeException 重新抛出，以便在调用处进行处理。
        try {
            inputStream = Resources.getResourceAsStream("mybatis-config.xml");
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
//        作用：使用 SqlSessionFactoryBuilder 构建一个 SqlSessionFactory 实例。
//        说明：
//        SqlSessionFactoryBuilder 是 MyBatis 提供的一个构建工具类，用于根据配置文件或配置对象创建 SqlSessionFactory。
//        build(InputStream inputStream) 方法读取输入流中的配置信息，解析 MyBatis 配置文件，并根据配置创建一个 SqlSessionFactory 实例。
//        SqlSessionFactory 是 MyBatis 的核心接口，用于创建 SqlSession 实例。

        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        SqlSession sqlSession = sqlSessionFactory.openSession();
//        作用：使用 SqlSessionFactory 打开一个 SqlSession 实例。
//        说明：
//        openSession() 方法创建并返回一个 SqlSession 实例，SqlSession 是 MyBatis 提供的核心接口，用于执行 SQL 语句、管理事务等。
//        SqlSession 实例是线程不安全的，通常在每次数据库操作时创建一个新的实例，并在操作完成后关闭它。
        UserMapper mapper = sqlSession.getMapper(UserMapper.class);
        login lg=sqlSession.getMapper(login.class);
//        作用：通过 SqlSession 实例获取一个指定类型的 Mapper 接口实例。
//        说明：
//        getMapper(Class<T> type) 是 SqlSession 提供的一个方法，用于获取与指定 Mapper 接口对应的代理对象。
//        MyBatis 会为 Mapper 接口动态生成一个代理类，该代理类实现了指定的 Mapper 接口，并且在方法调用时会根据映射文件中的 SQL 配置来执行相应的数据库操作。
//        UserMapper.class 是你定义的 Mapper 接口的类对象，MyBatis 会根据这个类对象生成对应的代理实例。
//        UserMapper mapper：
//        作用：将获取到的 Mapper 接口实例赋值给变量 mapper。
//        说明：
//        UserMapper 是你定义的 Mapper 接口类型。
//        通过这个 mapper 实例，你可以调用 UserMapper 接口中的方法来执行数据库操作。
//不能使用UserMapper mapper = new UserMapper()进行实例化，他不是默认的实现类
//        MyBatis 使用动态代理来生成 Mapper 接口的实现类，这意味着 Mapper 接口本身并没有具体的实现，而是由 MyBatis 在运行时根据映射文件动态生成实现类。因此，直接用 new 是不可能的，因为接口不能被直接实例化。
        List<user> list=mapper.selectUser();
        System.out.println(list.size());
//        loginuser lis= lg.selet("黄米面");
//        System.out.println(lis);
        List<loginuser> li=  lg.seletall();
        System.out.println(li);
//        返回的是单个对象，不是列表，不能用列表进行封装

//        List<user> li=mapper.selectUserById(2);
//        System.out.println(li);
//        MyBatis 默认情况下不会自动提交事务，需手动设置提交
//        int a=mapper.deleteUser1("嘎嘎嘎");
//        System.out.println(a);
//        sqlSession.commit();
//        int c=mapper.insertUser("zs","dddfg");
//         System.out.println(c);
//        sqlSession.commit();
//                int c=mapper.updateUser("sdcd","ddc",173);
//         System.out.println(c);
        sqlSession.commit();
        sqlSession.close();
    }

}